From 4b82fa19c759f3690402894a8d841716cff3f2ff Mon Sep 17 00:00:00 2001 From: "rn@wyvis.camb.intel-research.net" Date: Thu, 13 Feb 2003 18:08:51 +0000 Subject: [PATCH] bitkeeper revision 1.28 (3e4bdf33sufyB9J_a-mb8comwfYdfw) more elegant way of reading multiple values atomically --- .../arch/xeno/kernel/time.c | 31 +++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c b/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c index 7ba39d22ca..4999af6642 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c @@ -101,16 +101,12 @@ static inline long long get_s_time(void) spin_lock_irqsave(&hyp_stime_lock, flags); - pcc = HYPERVISOR_shared_info->st_timestamp; - mb(); - if (pcc != shadow_st_pcc) { -st_again: - shadow_st_pcc = HYPERVISOR_shared_info->st_timestamp; + while ((pcc = HYPERVISOR_shared_info->st_timestamp) != shadow_st_pcc) + { + barrier(); + shadow_st_pcc = pcc; shadow_st = HYPERVISOR_shared_info->system_time; - pcc = HYPERVISOR_shared_info->st_timestamp; - mb(); - if (pcc != shadow_st_pcc) - goto st_again; + barrier(); } now = shadow_st; @@ -120,7 +116,9 @@ st_again: delta = ((u64)delta_tsc * st_scale_f); delta >>= 32; delta += ((u64)delta_tsc * st_scale_i); + spin_unlock_irqrestore(&hyp_time_lock, flags); + return now + delta; } @@ -145,19 +143,14 @@ void do_gettimeofday(struct timeval *tv) spin_lock_irqsave(&hyp_wctime_lock, flags); - version = HYPERVISOR_shared_info->wc_version; - mb(); - if (version != shadow_wc_version) { - wc_again: - shadow_wc_version = HYPERVISOR_shared_info->wc_version; + while ((version = HYPERVISOR_shared_info->wc_version)!= shadow_wc_version) + { + barrier(); + shadow_wc_version = version; shadow_tv_sec = HYPERVISOR_shared_info->tv_sec; shadow_tv_usec = HYPERVISOR_shared_info->tv_usec; shadow_wc_timestamp = HYPERVISOR_shared_info->wc_timestamp; - shadow_wc_version = HYPERVISOR_shared_info->wc_version; - version = HYPERVISOR_shared_info->wc_version; - mb(); - if (version != shadow_wc_version) - goto wc_again; + barrier(); } now = NOW(); -- 2.30.2